print("202510141015 - 添加自动拒绝礼物功能")
-- 自动宠物赠送 + 自动接受 一体脚本
-- 角色可配置: sender / receiver / both

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local VirtualUser = cloneref(game:GetService("VirtualUser"))

local LocalPlayer = Players.LocalPlayer
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local GameEvents = ReplicatedStorage:WaitForChild("GameEvents")
-- 查找远程事件
local NotificationEvent = GameEvents:WaitForChild("Notification")
local HttpService = game:GetService("HttpService")
local GuiService = game:GetService("GuiService")
local VirtualInputManager = game:GetService("VirtualInputManager")

local config = {
	role = "both",           -- 角色: sender(仅发送) / receiver(仅接收) / both(发送接收都做)
	targetPlayer = "lamb199303",  -- 目标玩家名称  lamb199303  matye0829
	tradeDistance = 10,       -- 交易距离(单位:游戏单位)
	holdDurationPadding = 0.1, -- 触发提示的额外按住时间(秒)
	targetPetName = "Bunny",  -- 目标宠物名称关键词
	moveTimeout = 15,         -- 移动超时时间(秒)
	receiveTargetPetName = "Bunny",  -- 收货端目标宠物名称关键词
	-- 添加农场坐标配置
	farm1Position = Vector3.new(34.62943649291992, 3.0000457763671875, 36.79352951049805),
	-- 添加性能配置
	maxDescendantsSearch = 1000, -- 限制搜索范围
	promptSearchRadius = 15,     -- 提示搜索半径
}

local singleTradeTimeoutSeconds = 60 -- 单次交易最多等待1分钟

-- 定义宠物名称关键词列表（启动时尝试从图鉴模块动态载入）
local function getGuidePetNames()
	local ok, RS = pcall(function() return ReplicatedStorage end)
	if not ok or not RS then return nil end
	local path = { "Modules", "GardenGuideModules", "DataModules", "PetData" }
	local node = RS
	for _, name in ipairs(path) do
		node = node:FindFirstChild(name)
		if not node then return nil end
	end
	if not node:IsA("ModuleScript") then return nil end
	local okReq, mod = pcall(function() return require(node) end)
	if not okReq or typeof(mod) ~= "table" then return nil end
	local dataTable = mod.Data or mod.Pets or mod.PetList
	if typeof(dataTable) ~= "table" then return nil end
	local names = {}
	for k,_ in pairs(dataTable) do
		if typeof(k) == "string" and #k > 0 then
			table.insert(names, k)
		end
	end
	if #names == 0 then return nil end
	table.sort(names, function(a,b) return a:lower() < b:lower() end)
	return names
end

local defaultPetNames = {"Bunny","Lab","Dog","Cat","Bird","Pet","Golden","Dragon","Fox","Bee","Butterfly"}
local petNames = getGuidePetNames() or defaultPetNames

-- 日志记录函数，将信息输出到控制台和日志文件
local function log(msg)
	-- print("[Gift&Accept] " .. msg)  -- 输出到控制台
	local logMessage = string.format("[%s] %s", os.date("%Y-%m-%d %H:%M:%S"), tostring(msg))
	local ok = pcall(function()
		appendfile("gag_log.txt", logMessage .. "\n")  -- 尝试追加到日志文件
	end)
	-- 如果追加失败，尝试创建新文件
	if not ok then
		pcall(function()
			writefile("gag_log.txt", logMessage .. "\n")
		end)
	end
end

-- 判断物品是否为宠物（优先按分类，其次回退特征/名称）
local function isPet(tool)
	if not tool or not tool:IsA("Tool") then return false end

	local n = tool.Name or ""
	
	-- Grow a Garden 专用：包含重量信息即视为宠物（不要求年龄）
	local hasWeight = n:match("%[%d+%.%d+%sKG%]") ~= nil
	if hasWeight then
		-- log("isPet.gag= : " .. n)
		return true
	end

	-- 名称中包含已知宠物关键词（最后兜底）
	local name = tool.Name or ""
	local petKeywords = petNames
	local lname = name:lower()
	for _, kw in ipairs(petKeywords) do
		if lname:find(kw:lower()) then 
			log("isPet.name= " .. kw .. " in " .. n)
			return true 
		end
	end

	return false
end

--// Anti idle 防止掉线函数
LocalPlayer.Idled:Connect(function()

	VirtualUser:CaptureController()
	VirtualUser:ClickButton2(Vector2.new())
end)
-- ================== 发 送 端：宠物赠送 ==================

-- 获取目标玩家函数，优先使用配置中的目标玩家，如果没有则使用第二个玩家
local function getTarget()
	-- 尝试查找配置中的目标玩家
	local target = Players:FindFirstChild(config.targetPlayer)
	-- 如果找不到，则使用第二个玩家(第一个是本地玩家)
	if not target and #Players:GetPlayers() > 1 then
		target = Players:GetPlayers()[2]
	end
	return target
end

-- 移动到目标玩家附近的函数
local function moveNear(target)
	-- 检查本地玩家和目标玩家及其角色是否存在
	if not (LocalPlayer.Character and target and target.Character) then return false end
	
	-- 获取本地玩家和目标玩家的人形组件和根部件
	local myHum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
	local root = target.Character:FindFirstChild("HumanoidRootPart")
	-- 如果缺少必要组件则返回失败
	if not (myHum and root) then return false end
	log("目标: " ..tostring(root.Position))
	
	-- 移动到目标玩家位置
	myHum:MoveTo(root.Position)
	
	-- 等待直到接近目标玩家或超时
	local startTime = tick()
	local timeout = config.moveTimeout -- 使用配置中的超时时间
	
	while tick() - startTime < timeout do
		-- 获取本地玩家的根部件
		local meRoot = LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
		-- 检查距离是否在交易范围内
		if meRoot then
			local distance = (meRoot.Position - root.Position).Magnitude
			-- 只在开始时记录一次距离
			if tick() - startTime < 0.5 then
				log("距离目标: " .. math.floor(distance) .. " 单位")
			end
			-- 检查是否在交易范围内
			if distance <= config.tradeDistance then
				log("✅ 已接近目标，距离: " .. math.floor(distance))
				-- 接近后额外等待1秒确保UI完全加载
				wait(1)
				return true  -- 成功接近
			end
		end
		wait(0.2)  -- 等待0.2秒再次检查
	end
	log("❌ 接近目标超时")
	return false  -- 超时未成功接近
end

-- 清理所有选中状态的函数
local function clearAllSelections()
	log("🧹 清理所有选中状态...")
	
	local clearedCount = 0
	
	-- 1) 将手中宠物放回背包，避免二次选择叠加
	local character = LocalPlayer.Character
	if character then
		local equippedTool = character:FindFirstChildOfClass("Tool")
		if equippedTool and isPet(equippedTool) and equippedTool.Name:find(config.targetPetName) then
			local ok = pcall(function()
				equippedTool.Parent = LocalPlayer.Backpack
			end)
			if ok then
				clearedCount = clearedCount + 1
				log("✅ 已放回背包: " .. equippedTool.Name)
			end
		end
	end

	-- 2) 清理背包中的所有宠物选中状态
	local backpack = LocalPlayer:FindFirstChild("Backpack")
	if not backpack then 
		log("❌ 背包不存在")
		return false 
	end
	for _, tool in ipairs(backpack:GetChildren()) do
		if isPet(tool) and tool.Name:find(config.targetPetName) then
			-- 通过重新设置父级来取消选中状态
			local ok = pcall(function()
				tool.Parent = backpack
			end)
			if ok then
				clearedCount = clearedCount + 1
				log("✅ 清理选中状态: " .. tool.Name)
			end
		end
	end
	
	if clearedCount > 0 then
		log("✅ 已清理 " .. clearedCount .. " 个宠物的选中状态")
		wait(0.5)  -- 等待清理完成
		return true
	else
		log("📝 没有需要清理的选中状态")
		return true
	end
end

-- 智能装备宠物的函数
local function smartEquipPet(pet)
	if not pet then return false end
	
	log("🎯 智能装备宠物: " .. pet.Name)
	
	-- 方法1：尝试直接装备宠物到角色
	local success = pcall(function()
		pet.Parent = LocalPlayer.Character
	end)
	
	if success then
		wait(0.5)  -- 等待装备完成
		local character = LocalPlayer.Character
		if character then
			local equippedTool = character:FindFirstChildOfClass("Tool")
			if equippedTool and equippedTool.Name == pet.Name then
				log("✅ 直接装备成功: " .. pet.Name)
				return true
			end
		end
	end
	
	log("❌ 所有装备方法均失败")
	return false
end

-- 选中宠物
local function selectPet(pet)
	if not pet then 
		log("❌ 没有宠物可装备")
		return false 
	end
	
	log("🔧 选中宠物 " .. pet.Name)
	
	
	-- 检查宠物是否已经在手中
	local character = LocalPlayer.Character
	if character then
		local equippedTool = character:FindFirstChildOfClass("Tool")
		if equippedTool and equippedTool.Name == pet.Name then
			log("✅ 宠物已经在手中: " .. pet.Name)
			return true
		end
	end
	
	-- 使用智能装备方法
	return smartEquipPet(pet)
end

-- 检测背包和手中是否有指定宠物的函数
local function findPetInBackpack()
	log("🔍 开始搜索宠物（手中 + 背包，按分类Pet Items）...")
	local foundPets = {}

	-- 1) 手中
	local character = LocalPlayer.Character
	if character then
		local equippedTool = character:FindFirstChildOfClass("Tool")
		if isPet(equippedTool) and equippedTool.Name:find(config.targetPetName) then
			log("✅ 手中发现目标宠物: " .. equippedTool.Name)
			table.insert(foundPets, equippedTool)
		end
	end

	-- 2) 背包
	local backpack = LocalPlayer:FindFirstChild("Backpack")
	if not backpack then 
		log("❌ 背包不存在")
		return nil 
	end
	for _, tool in ipairs(backpack:GetChildren()) do
		-- 检查是否为工具类物品
		if tool:IsA("Tool") then
			-- 方法1: 直接打印对象（会调用默认的 tostring）
			log("发现工具: " .. tostring(tool))
		end
		if isPet(tool) and tool.Name:find(config.targetPetName) then
			log("✅ 背包中找到目标宠物: " .. tool.Name)
			table.insert(foundPets, tool)
		end
	end

	if #foundPets > 0 then
		log("✅ 共找到 " .. #foundPets .. " 个目标宠物")
		if #foundPets > 1 then
			table.sort(foundPets, function(a, b)
				local weightA = tonumber(a.Name:match("%[(%d+%.%d+) KG%]")) or 0
				local weightB = tonumber(b.Name:match("%[(%d+%.%d+) KG%]")) or 0
				return weightA > weightB
			end)
			log("🎯 选择重量最大的宠物: " .. foundPets[1].Name)
		end
		return foundPets[1]
	else
		log("❌ 未找到目标宠物: " .. config.targetPetName)
		return nil
	end
end

-- 获取当前宠物的函数
local function getCurrentPet()
	-- 获取本地玩家的角色
	local character = LocalPlayer.Character
	if not character then return nil end
	
	-- 检查角色上是否有已装备的工具(宠物)
	local equippedTool = character:FindFirstChildOfClass("Tool")
	if equippedTool then 
		log("当前已装备: " .. equippedTool.Name)
		return equippedTool 
	end
	
	-- 如果角色上没有装备，则在背包中查找
	local backpack = LocalPlayer:FindFirstChild("Backpack")
	if backpack then
		-- 遍历背包中的所有物品
		for _, tool in ipairs(backpack:GetChildren()) do
			-- 检查是否为工具类物品
			if tool:IsA("Tool") then
				local petKeywords = petNames
				-- 检查工具名称是否包含宠物关键词
				for _, n in ipairs(petKeywords) do
					log("tool属性=" .. tostring(tool) .. "，tool.Name=" .. tool.Name)
					if tool.Name:find(n) then return tool end
				end
			end
		end
	end
	
	return nil  -- 未找到宠物
end

-- =============== 目标玩家宠物收集与导出 ===============

-- 解析名称中的重量/年龄
local function parseWeightAge(name)
    local w = tonumber((name or ""):match("%[(%d+%.%d+)%sKG%]"))
    local a = tonumber((name or ""):match("%[Age%s(%d+)%]"))
    return w, a
end

-- 从指定玩家收集宠物（角色与背包）
local function collectPetsFromPlayer(player)
    local results = {}
    local seen = {}

    local function push(tool)
        if not tool or not tool:IsA("Tool") then return end
        if not isPet(tool) then return end
        local key = tool.Name
        if seen[key] then return end
        seen[key] = true
        local w, a = parseWeightAge(tool.Name)
        table.insert(results, { name = tool.Name, weight = w, age = a })
        log("🎯 目标玩家宠物: " .. tool.Name)
    end

    -- 角色手上
    local ch = player and player.Character
    if ch then
        for _, inst in ipairs(ch:GetChildren()) do
            if inst:IsA("Tool") then push(inst) end
        end
    end

    -- 背包（是否复制到客户端取决于游戏，若拿不到则为空）
    local backpack = player and player:FindFirstChild("Backpack")
    if backpack then
        for _, inst in ipairs(backpack:GetChildren()) do
            if inst:IsA("Tool") then push(inst) end
        end
    else
        log("ℹ️ 对方 Backpack 不可见或未复制")
    end

    return results
end

local function exportTargetPlayerPets()
    local target = getTarget()
    if not target then log("❌ 无目标玩家") return end
    log("🔍 收集目标玩家宠物: " .. target.Name)
    local pets = collectPetsFromPlayer(target)

    -- 导出
    local okJson, encoded = pcall(function() return HttpService:JSONEncode(pets) end)
    if okJson then pcall(function() writefile("target_pets_export.json", encoded) end) end
    local lines = {}
    for _, p in ipairs(pets) do
        lines[#lines+1] = string.format("%s\tweight=%s\tage=%s", p.name, tostring(p.weight or "-"), tostring(p.age or "-"))
    end
    pcall(function() writefile("target_pets_export.txt", table.concat(lines, "\n")) end)
    log("💾 已导出到 target_pets_export.json / target_pets_export.txt (共 " .. tostring(#pets) .. " 条)")
end

-- 全局变量用于存储交易结果
local tradeResult = nil
local tradeResultConnection = nil

-- 设置交易结果监听器
local function setupTradeResultListener()
	if tradeResultConnection then
		tradeResultConnection:Disconnect()
		tradeResultConnection = nil
	end
	
	tradeResult = nil
	tradeResultConnection = NotificationEvent.OnClientEvent:Connect(function(message)
		log("收到通知: " .. message)
		
		if message:find("Your target has declined your trade") then
			log("❌ 检测到拒绝通知: " .. message)
			tradeResult = "declined"
		elseif message:find("Trade completed") then
			log("✅ 检测到完成通知: " .. message)
			tradeResult = "completed"
		end
	end)
end

-- 清理交易结果监听器
local function cleanupTradeResultListener()
	if tradeResultConnection then
		tradeResultConnection:Disconnect()
		tradeResultConnection = nil
	end
	tradeResult = nil
end


-- 综合监听方案：使用 NotificationEvent + 背包变化
local function waitForGiftResult(timeoutSeconds)
	timeoutSeconds = timeoutSeconds or 60
	local startTime = os.time()
	local result = "timeout"
	
	log("🔍 开始综合监听礼物结果，超时时间: " .. timeoutSeconds .. " 秒")
	log("🔍 使用 NotificationEvent 监听方案")
	
	-- 设置交易结果监听器
	setupTradeResultListener()
	
	-- 记录初始背包状态
	local initialBackpackPets = {}
	local backpack = LocalPlayer:FindFirstChild("Backpack")
	if backpack then
		for _, tool in ipairs(backpack:GetChildren()) do
			if isPet(tool) and tool.Name:find(config.targetPetName) then
				initialBackpackPets[tool.Name] = true
				log("📦 初始背包宠物: " .. tool.Name)
			end
		end
	end
	
	-- 定期检查背包状态和事件结果
	local function checkStatus()
		-- 检查事件结果
		if tradeResult then
			result = tradeResult
			log("📡 事件监听器检测到结果: " .. result)
			return
		end
		
		-- 检查背包状态
		if backpack then
			local currentPets = {}
			for _, tool in ipairs(backpack:GetChildren()) do
				if isPet(tool) and tool.Name:find(config.targetPetName) then
					currentPets[tool.Name] = true
				end
			end
			
			-- 检查是否有宠物被移除
			for petName, _ in pairs(initialBackpackPets) do
				if not currentPets[petName] then
					log("🎁 定期检查发现宠物移除: " .. petName)
					if result == "timeout" then
						result = "completed"
						log("✅ 定期检查：赠送成功")
					end
					return
				end
			end
		end
	end
	
	-- 等待结果或超时
	while os.time() - startTime < timeoutSeconds and result == "timeout" do
		checkStatus()
		
		if result ~= "timeout" then
			break
		end
		wait(0.5)
	end
	
	-- 清理监听器
	cleanupTradeResultListener()
	
	if result == "timeout" then
		log("⏰ 等待礼物结果超时")
	end
	
	return result
end

-- 赠送宠物的主函数（简化版本）
local function giftPet()
	log("🎁 开始宠物赠送流程...")
	
	-- 首先清理所有选中状态，确保干净的开始
	clearAllSelections()
	
	-- 获取目标玩家
	local target = getTarget()
	if not target then log("❌ 无目标玩家") return end
	log("✅ 目标玩家: " .. target.Name)
	
	-- 检测背包中是否有指定宠物
	local pet = findPetInBackpack()
	if not pet then 
		log("❌ 背包中未找到目标宠物: " .. config.targetPetName)
		return 
	end
	log("✅ 找到目标宠物: " .. pet.Name)
	
	-- 移动到目标附近
	if not moveNear(target) then log("❌ 无法靠近目标") return end
	
	-- 选中宠物
	if not selectPet(pet) then 
		log("❌ 装备宠物失败")
		return 
	end
	
	-- 等待装备完成
	wait(1)
	
	-- 直接查找目标玩家角色上的 ProximityPrompt
	local char = target.Character
	if char and char:FindFirstChild("HumanoidRootPart") then
		local prompt = char.HumanoidRootPart:FindFirstChildWhichIsA("ProximityPrompt", true)
		if prompt then
			log("✅ 找到目标玩家身上的提示: " .. prompt.ActionText)
			
			-- 触发提示
			local success = false
			-- 使用 VirtualInputManager 发送 E 键
			if not success then
				log("🔄 尝试使用 E 键触发...")
				task.spawn(function()
					VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.E, false, game)
					wait(5)
					VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.E, false, game)
				end)
				success = true
			end
			
			if success then
				log("✅ 已触发赠送，等待礼物结果...")
				
				-- 等待礼物赠送结果
				local result = waitForGiftResult(singleTradeTimeoutSeconds)
				if result == "completed" then
					log("✅ 礼物赠送成功")
					return true
				elseif result == "declined" then
					log("❌ 礼物被对方拒绝")
					return false
				elseif result == "timeout" then
					log("❌ 等待礼物结果超时")
					return false
				elseif result == "error" then
					log("❌ 礼物结果检测出错")
					return false
				end
			else
				log("❌ 所有触发方法均失败")
				return false
			end
		else
			log("❌ 目标玩家身上未找到 ProximityPrompt")
			return false
		end
	else
		log("❌ 目标玩家角色或 HumanoidRootPart 不存在")
		return false
	end
end

-- ================== 接 收 端：自动接受 ==================

-- 触发按钮所有连接事件的函数
local function fireAllConnections(btn)
	local any = false  -- 标记是否有任何事件被触发
	
	-- 内部函数：触发单个信号连接
	local function fire(signal)
		-- 如果信号不存在则返回
		if not signal then return end
		
		-- 使用pcall防止错误
		pcall(function()
			-- 检查getconnections函数是否可用
			if typeof(getconnections) == "function" then
				-- 获取所有连接
				for _, c in ipairs(getconnections(signal)) do
					pcall(function()
						-- 尝试调用连接函数或触发事件
						if c.Function then c.Function() elseif c.Fire then c:Fire() end
						any = true  -- 标记已触发事件
					end)
				end
			end
		end)
	end
	
	-- 尝试触发按钮的各种事件
	-- fire(btn.Activated)       -- 激活事件
	fire(btn.MouseButton1Click)  -- 鼠标左键点击事件
	-- 注释掉的事件(备用)
	-- fire(btn.MouseButton1Down)
	-- fire(btn.MouseButton1Up)
	
	return any  -- 返回是否有事件被触发
end

-- 获取礼物通知界面中的接受和拒绝按钮
local function getButtons()
	-- 获取玩家GUI
	local pg = LocalPlayer:FindFirstChild("PlayerGui")
	if not pg then return nil, nil end
	
	-- 查找礼物通知界面
	local gui = pg:FindFirstChild("Gift_Notification")
	if not gui then return nil, nil end
	
	-- 通过多层嵌套查找接受和拒绝按钮
	local f1 = gui:FindFirstChild("Frame"); if not f1 then return nil,nil end
	local g2 = f1:FindFirstChild("Gift_Notification"); if not g2 then return nil,nil end
	local holder = g2:FindFirstChild("Holder"); if not holder then return nil,nil end
	local f2 = holder:FindFirstChild("Frame"); if not f2 then return nil,nil end
	
	-- 返回接受和拒绝按钮
	return f2:FindFirstChild("Accept"), f2:FindFirstChild("Decline")
end

-- 点击按钮的函数，多种方法尝试点击按钮
local function clickButton(btn)
	-- 如果按钮不存在则返回失败
	if not btn then return false end
	-- 触发所有连接事件（不提前返回，后续仍尝试 VIM 点击以确保生效）
	fireAllConnections(btn)

	-- 方法1: 设置焦点 + 发送按键事件（参考代码方法）
	pcall(function()
		local guiService = GuiService
		local vim = VirtualInputManager
		if guiService and vim and typeof(vim.SendKeyEvent) == "function" then
			log("🖱️ 尝试设置焦点 + 按键: " .. tostring(btn.Name))
			guiService.SelectedObject = btn
			wait(0.1) -- 等待焦点设置完成
			vim:SendKeyEvent(true, Enum.KeyCode.Return, false, game)
			wait(0.05)
			vim:SendKeyEvent(false, Enum.KeyCode.Return, false, game)
			
		end
		wait(0.1)
		guiService.SelectedObject = nil
	end)



	return true  -- 默认返回成功
end


-- 检查目标玩家手中的宠物是否符合要求
local lastToolName = ""  -- 跟踪上次的工具名称
local function checkTargetPlayerPet()
	local target = getTarget()
	if not target then 
		-- log("❌ 无法获取目标玩家")
		return false 
	end
	
	-- 检查目标玩家角色是否存在
	local character = target.Character
	if not character then
		log("❌ 目标玩家角色不存在")
		return false
	end
	
	-- 检查目标玩家手中的工具
	local equippedTool = character:FindFirstChildOfClass("Tool")
	if not equippedTool then
		return false
	end
	
	-- 只在工具名称发生变化时打印日志
	if equippedTool.Name ~= lastToolName then
		log("🔍 目标玩家手中的工具: " .. equippedTool.Name)
		
		-- 检查是否为宠物
		if not isPet(equippedTool) then
			log("❌ 目标玩家手中的不是宠物: " .. equippedTool.Name)
			lastToolName = equippedTool.Name
			return false
		end
		
		-- 检查是否包含目标宠物名称关键词
		if not equippedTool.Name:find(config.receiveTargetPetName) then
			log("❌ 目标玩家手中的宠物不是我们想要的: " .. equippedTool.Name .. " (期望包含: " .. config.receiveTargetPetName .. ")")
			lastToolName = equippedTool.Name
			return false
		end
		
		-- 解析宠物数据
		local weight, age = parseWeightAge(equippedTool.Name)
		log("✅ 目标玩家手中的宠物符合要求: " .. equippedTool.Name)
		log("📊 宠物数据 - 重量: " .. tostring(weight or "未知") .. " KG, 年龄: " .. tostring(age or "未知"))
		lastToolName = equippedTool.Name
	end
	
	return true
end

-- 自动接受礼物的函数
local function autoAccept()
	-- 获取接受按钮
	local accept = select(1, getButtons())

	if accept then clickButton(accept) end
end
-- 自动拒绝礼物的函数
local function autoDecline()
	local decline = select(2, getButtons())
	if decline then clickButton(decline) end
end

-- 设置自动接受礼物的监听器
local function setupAutoAccept()
	-- 等待并获取玩家GUI
	local pg = LocalPlayer:WaitForChild("PlayerGui")
	
	-- 监听GUI子元素添加事件
	pg.ChildAdded:Connect(function(child)
		-- 如果是礼物通知，则检查目标玩家手中的宠物
		if child.Name == "Gift_Notification" then 
			log("🎁 收到礼物通知，开始检查目标玩家手中的宠物...")
			
			-- 检查目标玩家手中的宠物是否符合要求
			local isValidPet = checkTargetPlayerPet()
			
			if isValidPet then
				-- log("✅ 目标玩家手中的宠物符合要求，准备接受礼物...")
				wait(0.2) 
				autoAccept()
			else
				-- log("❌ 目标玩家手中的宠物不符合要求，拒绝接受礼物")
				wait(0.2) 
				autoDecline()
			end
		end
	end)
	
	-- 启动后台循环作为备用机制，定期检查礼物通知
	spawn(function()
		while true do
			-- 检查是否存在礼物通知界面
			local giftNotification = pg:FindFirstChild("Gift_Notification")
			if giftNotification then
				-- log("🔍 后台循环检测到礼物通知界面，开始处理...")
				
				-- 检查目标玩家手中的宠物是否符合要求
				local isValidPet = checkTargetPlayerPet()
				
				if isValidPet then
					-- log("✅ 后台循环：目标玩家手中的宠物符合要求，准备接受礼物...")
					autoAccept()
				else
					-- log("❌ 后台循环：目标玩家手中的宠物不符合要求，拒绝接受礼物")
					autoDecline()
				end
			end
			
			wait(1) -- 每秒检查一次
		end
	end)
	
end

-- 移动到1号农场初始位置的函数（使用配置坐标）
local function moveToFarm1()
	-- 检查本地玩家和角色是否存在
	if not LocalPlayer or not LocalPlayer.Character then
		log("❌ 本地玩家或角色不存在")
		return false
	end
	
	-- 获取人形组件
	local myHum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
	if not myHum then
		log("❌ 角色没有人形组件")
		return false
	end
	
	-- 使用配置中的农场坐标
	local farm1Position = config.farm1Position
	
	log("🔄 从0号农场移动到1号农场...")
	myHum:MoveTo(farm1Position)
	
	-- 等待直到到达1号农场或超时
	local startTime = tick()
	local timeout = config.moveTimeout -- 使用配置中的超时时间
	
	log("📍 1号农场目标坐标: " .. tostring(farm1Position))
	
	while tick() - startTime < timeout do
		local rootPart = LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
		if rootPart then
			local distance = (rootPart.Position - farm1Position).Magnitude
			-- 记录当前位置信息
			if tick() - startTime < 0.5 then
				log("距离1号农场目标位置: " .. math.floor(distance) .. " 单位")
				log("📍 当前坐标: " .. tostring(rootPart.Position))
			end
		
			if distance <= config.tradeDistance then
				log("✅ 已到达1号农场，距离: " .. math.floor(distance))
				log("📍 当前坐标: " .. tostring(rootPart.Position))
				return true
			end
		end
		wait(0.2)
	end
	
	return false
end

-- =============== 入口与快捷键 ===============

-- 记录脚本加载信息
log("一体化脚本已加载，role=" .. config.role)


local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "GrowAGardenFakeGUI"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = game.CoreGui

-- Main Window
local MainFrame = Instance.new("Frame")
MainFrame.Size = UDim2.new(0, 150, 0, 200)
MainFrame.Position = UDim2.new(0.5, -150, 0.5, 0)
MainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
MainFrame.BorderSizePixel = 0
MainFrame.Parent = ScreenGui
MainFrame.AnchorPoint = Vector2.new(0.5, 0.5)
MainFrame.BackgroundTransparency = 0.2
MainFrame.ClipsDescendants = true
MainFrame.Active = true
MainFrame.Draggable = true

-- Close button
local CloseBtn = Instance.new("TextButton")
CloseBtn.Size = UDim2.new(0, 25, 0, 25)
CloseBtn.Position = UDim2.new(1, -35, 0, 5)
CloseBtn.BackgroundColor3 = Color3.fromRGB(180, 30, 30)
CloseBtn.TextColor3 = Color3.new(1,1,1)
CloseBtn.Font = Enum.Font.GothamBold
CloseBtn.TextScaled = true
CloseBtn.Text = "X"
CloseBtn.Parent = MainFrame

CloseBtn.MouseButton1Click:Connect(function()
    ScreenGui:Destroy()
end)

-- Helper to create buttons
local function CreateButton(name, posY)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(0.8, 0, 0, 30)
    btn.Position = UDim2.new(0.1, 0, 0, posY)
    btn.BackgroundColor3 = Color3.fromRGB(255, 140, 0)
    btn.BorderSizePixel = 0
    btn.TextColor3 = Color3.new(1,1,1)
    btn.Font = Enum.Font.GothamBold
    btn.TextScaled = true
    btn.Text = name
    btn.Parent = MainFrame
    return btn
end

-- Buttons
local Btn1 = CreateButton("赠送宠物 ", 60)
local Btn2 = CreateButton("获得目标宠物", 110)

-- Button handlers
Btn1.MouseButton1Click:Connect(function()
	giftPet() 
end)

Btn2.MouseButton1Click:Connect(function()
	exportTargetPlayerPets()
end)

-- 根据配置的角色设置功能
if config.role == "sender" or config.role == "both" then
	-- 监听键盘输入事件
UserInputService.InputBegan:Connect(function(input, gp)
	-- 如果输入被游戏处理则忽略
	if gp then return end
	-- 如果按下P键，则触发赠送宠物功能
    if input.KeyCode == Enum.KeyCode.P then giftPet() end
    if input.KeyCode == Enum.KeyCode.J then exportTargetPlayerPets() end
	end)
	log("P 键：赠送宠物")
	log("J 键：导出目标玩家宠物 target_pets_export.json/txt")
end

-- 房主启动时自动移动到1号农场
log("检测到房主，准备移动到1号农场")
moveToFarm1()


-- 如果配置为接收端或双向模式，则设置自动接受
if config.role == "receiver" or config.role == "both" then
	setupAutoAccept()
	log("已开启自动接受")
end

log("petNames = " .. table.concat(petNames, ", "))
log("petNames count = " .. tostring(#petNames))
